package com.divemotor.ventarepuestosinternet.dao.impl;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.divemotor.ventarepuestosinternet.dao.ImagenRepuestoDAO;
import com.divemotor.ventarepuestosinternet.model.ImagenRepuesto;
import com.divemotor.ventarepuestosinternet.model.Repuesto;
import com.divemotor.ventarepuestosinternet.util.Constantes;

@SuppressWarnings("unchecked")
@Repository(value = "imagenRepuestoDAO")
public class ImagenRepuestoDAOImpl implements ImagenRepuestoDAO, Serializable {

	private static final long serialVersionUID = -7050475953438424098L;
	
	@Autowired
	private SessionFactory sessionFactory;

	@Override
	public List<ImagenRepuesto> listarImagenesRepuestosPorImagen(ImagenRepuesto imagenRepuesto) {
		Criteria criteria = sessionFactory.getCurrentSession().createCriteria(ImagenRepuesto.class)
				.add(Restrictions.eq("imagen", imagenRepuesto.getImagen()))
				.add(Restrictions.not(Restrictions.eq("estado", Constantes.ESTADO_ELIMINADO)))
				.addOrder(Order.asc("posicion"));
		return criteria.list();
	}

	public List<ImagenRepuesto> listarImagenesRepuestosActivosPorImagen(ImagenRepuesto imagenRepuesto) {
		Criteria criteria = sessionFactory.getCurrentSession().createCriteria(ImagenRepuesto.class, "imagenRepuesto")
				.createAlias("imagenRepuesto.repuesto", "repuesto") 
				.add(Restrictions.eq("imagen", imagenRepuesto.getImagen()))
				.add(Restrictions.eq("repuesto.indRepReemplazo", Constantes.INDICADOR_NEGATIVO))
				.add(Restrictions.in("estado", new String[] {Constantes.ESTADO_ACTIVO, Constantes.ESTADO_NO_APLICA}))
				.addOrder(Order.asc("posicion"));
		return criteria.list();
	}
	
	@Override
	public void insertar(ImagenRepuesto imagenRepuesto) {
		sessionFactory.getCurrentSession().persist(imagenRepuesto);
	}

	@Override
	public void eliminar(ImagenRepuesto imagenRepuesto) {
		sessionFactory.getCurrentSession().delete(imagenRepuesto);
	}

	@Override
	public List<ImagenRepuesto> buscarPorNombreRepuesto(Repuesto repuesto) {
		Criteria criteria = sessionFactory.getCurrentSession().createCriteria(ImagenRepuesto.class, "imagenRepuesto")
				.createAlias("imagenRepuesto.repuesto", "repuesto")
				.createAlias("imagenRepuesto.imagen", "imagen")
				.add(Restrictions.not(Restrictions.eq("estado", Constantes.ESTADO_ELIMINADO)))
				.add(Restrictions.like("repuesto.nombre", "%" + repuesto.getNombre() + "%").ignoreCase())
				.addOrder(Order.asc("repuesto.nombre"))
				.addOrder(Order.asc("imagen.idImagen"));
		return criteria.list();
	}

	@Override
	public List<ImagenRepuesto> buscarActivosPorNombreRepuesto(Repuesto repuesto) {
		Criteria criteria = sessionFactory.getCurrentSession().createCriteria(ImagenRepuesto.class, "imagenRepuesto")
				.createAlias("imagenRepuesto.repuesto", "repuesto")
				.createAlias("imagenRepuesto.imagen", "imagen")
				.add(Restrictions.eq("estado", Constantes.ESTADO_ACTIVO))
				.add(Restrictions.like("repuesto.nombre", "%" + repuesto.getNombre() + "%").ignoreCase())
				.addOrder(Order.asc("repuesto.nombre"))
				.addOrder(Order.asc("imagen.idImagen"));
		return criteria.list();
	}

	@Override
	public void actualizar(ImagenRepuesto imagenRepuesto) {
		sessionFactory.getCurrentSession().merge(imagenRepuesto);
	}

}
